/*
 * Copyright (C) 2013 Félix Marín Ramírez | felixmurcia@gmail.com
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/*
 * DOCUMENTACION: http://documentacion-emple-depart.tk
 */
package adgui.controlador;

import adgui.modelo.ConsultaAltaEmple;
import adgui.vista.AltaEmple;
import java.sql.SQLException;

/**
 *
 * @author Félix Marín Ramírez | felixmurcia@gmail.com
 * @version 1.0
 */
public class ControlAltaEmple extends Control {

    private ConsultaAltaEmple mInsertEmple; //MODELO
    private AltaEmple vInsertEmple; //VISTA
    //---//
    private String oficio;
    private int director;
    private int departamento;
    private double salario;
    private double comision;
    private int emp_no;

    /**
     * Constructor de la clase encargado de instanciar las clases de la vista y
     * el modelo.
     *
     * @param vInsertEmple Parámetro que contiene una instancia de la vista.
     * @throws SQLException Este método lanza una excepción la cual va implicita
     * al crear el objeto mInsertEmple de la clase ConsultaAltaEmple (MODELO).
     */
    public ControlAltaEmple(AltaEmple vInsertEmple) throws SQLException, ClassNotFoundException {
        this.vInsertEmple = vInsertEmple;
        mInsertEmple = new ConsultaAltaEmple();
    }

    /**
     *
     * @return Devuelve el nombre del oficio.
     */
    public String getOficio() {
        return oficio;
    }

    /**
     *
     * @param oficio Establece el nombre del oficio
     */
    public void setOficio(String oficio) {
        this.oficio = oficio;
    }

    /**
     *
     * @return Devuelve el nombre del director
     */
    public int getDirector() {
        return director;
    }

    /**
     *
     * @param director Establece el nombre del director
     */
    public void setDirector(int director) {
        this.director = director;
    }

    /**
     *
     * @return Devuelve el nombre del departamento
     */
    public int getDepartamento() {
        return departamento;
    }

    /**
     *
     * @param departamento Establece el nombre del departamento
     */
    public void setDepartamento(int departamento) {
        this.departamento = departamento;
    }

    /**
     *
     * @return Devuelve el objeto mInsertEmple el cual da acceso a la
     * información de los empleados y los departamentos.
     */
    public ConsultaAltaEmple getmInsertEmple() {
        return mInsertEmple;
    }

    /**
     *
     * @return Devuelve el objeto vInsertEmple el cual da acceso a la a los
     * campos de texto y demás elementos de la vista.
     */
    public AltaEmple getvInsertEmple() {
        return vInsertEmple;
    }

    /**
     * Método encargado de calcular la comisión de un empleado a la hora de
     * darlo de alta.
     *
     * @throws NumberFormatException Excepcion producida si los caracteres
     * introducidos no se pueden parsear a double.
     */
    public void calcularComision() throws NumberFormatException {
        salario = Double.parseDouble(vInsertEmple.getTfSalario().getText());
        for (int i : mInsertEmple.getListaCodDep()) {
            if (departamento == i) {
                comision = (i * 5);
            }
        }
        vInsertEmple.cambiarTextoCampoComision(String.valueOf(comision));
    }

    /**
     * Método encargado de calcular el número de empleado cuado éste sea dado de
     * alta.
     */
    public void calcularEmpNo() {
        emp_no = mInsertEmple.getListaCodEmple()
                .get(mInsertEmple.getListaCodEmple().size() - 1) + 10;
        vInsertEmple.cambiarTextoCampoResultados("El empleado tendrá el número "
                + emp_no);
    }

    /**
     * Método sobreescrito utilizado para crear un nuevo objeto de la clase
     * modelo y de esta manera actualizar los datos.
     *
     * @throws SQLException Este método lanza una excepción la cual va implicita
     * al crear el objeto mDep de la clase ConsultaAltaDepart (MODELO).
     */
    @Override
    public void recargar() {
        try {
            mInsertEmple = null;
            mInsertEmple = new ConsultaAltaEmple();
        } catch (SQLException | ClassNotFoundException ex) {
            vInsertEmple.mensajeError(ex.getMessage());
        }
    }

    /**
     * Método encargado de insertar el nuevo empleado.
     *
     * @throws SQLException Este método lanza una excepción la cual va implicita
     * al utilizar el método altaEmpleado() de la clase ConsultaAltaEmple
     * (MODELO).
     */
    public void insertarEmple() throws SQLException {
        try {
            mInsertEmple.AltaEmpleado(
                    emp_no,
                    vInsertEmple.getTfApellido().getText().toUpperCase(),
                    oficio,
                    director,
                    //mInsertEmple.getFechaActual(),
                    null,
                    salario,
                    comision,
                    departamento);

            if (mInsertEmple.getFilasAfectadas() == 1) {
                vInsertEmple.cambiarTextoCampoResultados(
                        "Nuevo empleado creado!");
            } else {
                vInsertEmple.cambiarTextoCampoResultados(
                        "No se ha podido isertar el nuevo empleado");
            }
        } catch (ClassNotFoundException ex) {
            vInsertEmple.mensajeError(ex.getMessage());
        }

    }

    /**
     * Método encargado de insetar los elementos de la lista listaOficios
     * (MODELO) en el combo cbOficio de la clase AltaEmple (VISTA).
     */
    public void setComboOficio() {
        vInsertEmple.getComboOficio().addItem("");
        for (String oficio : mInsertEmple.getListaOficios()) {
            vInsertEmple.getComboOficio().addItem(oficio);
        }
    }

    /**
     * Método encargado de insetar los elementos de la lista listaOficios
     * (MODELO) en el combo cbDirector de la clase AltaEmple (VISTA).
     */
    public void setComboDirector() {
        vInsertEmple.getComboDirector().addItem("");
        for (String dnombre : mInsertEmple.getListaNombreDir()) {
            vInsertEmple.getComboDirector().addItem(dnombre);
        }
    }

    /**
     * Método encargado de insetar los elementos de la lista listaOficios
     * (MODELO) en el combo cbDepart de la clase AltaEmple (VISTA).
     */
    public void setComboDepart() {
        vInsertEmple.getComboDepart().addItem("");
        for (String depart : mInsertEmple.getListaDepartamentos()) {
            vInsertEmple.getComboDepart().addItem(depart);
        }
    }
}
